package main

import (
    "fmt"
    "net/http"
    "time"
)

// hello 是一个 HTTP 处理函数（HandlerFunc），当客户端请求 /hello 路径时被调用
func hello(w http.ResponseWriter, req *http.Request) {

    // 从请求中提取 context（上下文），可以检测请求是否已被取消（如客户端断开连接）
    ctx := req.Context()

    fmt.Println("server: hello handler started") // 表示请求开始处理
    defer fmt.Println("server: hello handler ended") // 请求处理完后自动打印结束信息

    // select 监听两个 channel：
    // 1. 模拟长时间处理任务：10 秒后输出 "hello"
    // 2. 如果 context 被取消（如客户端中止连接），立即响应取消
    select {
    case <-time.After(10 * time.Second): // 模拟耗时任务
        fmt.Fprintf(w, "hello\n") // 正常响应客户端
    case <-ctx.Done(): // 客户端取消了请求（如关闭浏览器或超时）
        err := ctx.Err() // 获取取消原因（context.Canceled 或 context.DeadlineExceeded）
        fmt.Println("server:", err)

        // 返回 HTTP 500 错误响应
        internalError := http.StatusInternalServerError
        http.Error(w, err.Error(), internalError)
    }
}

func main() {

    // 注册路由 /hello，关联 hello 处理函数
    http.HandleFunc("/hello", hello)

    // 启动 HTTP 服务，监听在 8090 端口
    // 第二个参数为 nil 表示使用默认的 ServeMux 路由器
    http.ListenAndServe(":8090", nil)
}
